﻿//
// Copyright (c) 2011 David Díaz & Fran Pedreira
//
// This file is part of PlanSim.
//
// PlanSim is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PlanSim is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PlanSim. If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PlanSim.Core
{
    public interface IPlanificador
    {
		/// <summary>
		/// Evento que se dispara al inicio de la simulación.
		/// </summary>
		event EventHandler ComienzaSimulacion;

		/// <summary>
		/// Evento que se dispara a la finalización de la simulación.
		/// </summary>
		event EventHandler FinalizaSimulacion;

		/// <summary>
		/// Evento que se dispara al inicio de un nuevo ciclo de procesador.
		/// </summary>
		event EventHandler ComienzaCiclo;

		/// <summary>
		/// Evento que se dispara a la finalización de un ciclo de procesador.
		/// </summary>
		event EventHandler FinalizaCiclo;

		/// <summary>
		/// Inicia la simulación.
		/// </summary>
		/// <param name="frecuencia">Frecuencia de ejecución de la simulación.</param>
		void IniciarSimulacion(int frecuencia);

		/// <summary>
		/// Detiene la simulación.
		/// </summary>
		void DetenerSimulacion();

		/// <summary>
		/// Añade un nuevo proceso en la simulación.
		/// </summary>
		/// <param name="proceso">Proceso a añadir.</param>
		/// <returns>true si se pudo añadir. False en caso contrario (la simulaicón está detenida).</returns>
        void InsertarProceso(IProceso proceso, string colaInicial);

		/// <summary>
		/// Obtiene el ciclo actual de la simulación.
		/// </summary>
		int CicloActual { get; }

		/// <summary>
		/// Obtiene una referencia al proceso que actualmente ocupa la CPU.
		/// </summary>
		IProceso ProcesoEnCPU { get; }

		/// <summary>
		/// Obtiene el número de cilos que lleva el proceso actual asignado a la CPU.
		/// </summary>
		/// <remarks>
		/// Es útil para algunas estrategias, como Round Robin, que limitan el 
		/// número de ciclos de CPU que un proceso consume de forma continuada.
		/// </remarks>
		int CiclosEnCPU { get; }
    }
}
